package io.renren.modules.iots.test.socket.client;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @ClassName: SingleSocketClientThread
 * @Description: 单例模式SocketClientThread类
 * @author 周西栋
 * @date 2018年5月8日
 *
 */
public class SingleSocketReadThread implements Runnable {
	
	/************************************************      全局变量     ************************************************/
	
    /**
     * SocketChannel管理器
     */
    public static Map<SelectionKey,SocketChannel> socketChannelMap = new HashMap<>();
    
	/************************************************      全局变量     ************************************************/
	
	/************************************************      单例模式     ************************************************/
	
    /**
     * 创建一个新的实例 SingleSocketClientThread.
     */
    private SingleSocketReadThread() {
    	new Thread(this).start();
    }
    
    /**
     * 私有对象变量
     */
    private static final SingleSocketReadThread single = new SingleSocketReadThread();
    
    /**
     * @Title: getInstance
     * @Description: 饿汉模式--单例（静态工厂方法） 
     * @param @return    参数
     * @return SingleSocketClientThread    返回类型
     * @throws
     */
    public static SingleSocketReadThread getInstance() {
        return single;
    }
	
	/************************************************      单例模式     ************************************************/
	
	@Override
	public void run() {
		System.out.println("我启动了一个读信息的线程");
        // 轮询访问selector
        while (!socketChannelMap.isEmpty()) {
        	try {
				Thread.sleep(10);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
        	Set<SelectionKey> keys = socketChannelMap.keySet();
        	for(SelectionKey key :keys){
        		SocketChannel channel = socketChannelMap.get(key);
        		try {
					readBuffer(channel);
				} catch (IOException e) {
					e.printStackTrace();
				}
        	}
        }
	}
	
	
    /**
     * @Title: readBuffer
     * @Description: 从缓冲区中读取数据
     * @param @param channel
     * @param @throws IOException    参数
     * @return void    返回类型
     * @throws
     */
    public void readBuffer(SocketChannel channel) throws IOException{
    	// 创建读取的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        channel.read(buffer);
        byte[] data = buffer.array();
        String msg = new String(data).trim();
        System.out.println("服务端收到信息：" + msg);
        // 调用信息转存方法
//      putIntoKafka(msg);
    }
}